package main

import (
	"encoding/json"
	"fmt"
	"math/rand"
	"os"
	"time"
)

func main() {
	/*
		随机点名系统
		切片类型存放名字
		按任意键抽取一个名字，抽取后从切片中删除
		按Q退出或者切片长度为零停止
		使用json记录每个名字被点名的次数
	*/

	// 读取点名信息
	userInfo := read()

	// 初始化名字切片列表
	nameList := []string{"名字1", "名字2", "名字3", "名字4", "名字5"}

	for {
		fmt.Println("------------------------------")
		fmt.Println("按任意键抽取名字。输入'q'退出。输入'c'查看点名统计信息")
		choice := ""
		fmt.Scanln(&choice)

		if choice == "q" { // 按q退出
			break
		} else if choice == "c" { //按c查看统计信息
			fmt.Println("--------------------")
			fmt.Println("名字\t被点名次数")
			for userName, callCount := range userInfo {
				fmt.Println(userName, "\t", callCount)
			}
			break
		} else {
			if len(nameList) == 1 {
				fmt.Printf("本次抽取的名字为：%s\n名单抽取完成", nameList[0])
				userInfo[nameList[0]] = userInfo[nameList[0]] + 1 // 被点名次数+1
				write(userInfo)                                   // 写入文件
				break
			} else {
				rand.Seed(time.Now().Unix())             //时间种子随机数
				randomNumber := rand.Intn(len(nameList)) // 获取随机数
				getName := nameList[randomNumber]        // 获取随机名

				userInfo[getName] = userInfo[getName] + 1 // 被点名次数+1
				fmt.Println("本次抽取的名字为：", getName)

				nameList = append(nameList[:randomNumber], nameList[(randomNumber+1):]...) // 删除抽取到的名字
				fmt.Println("剩余名单列表：", nameList)
				write(userInfo) // 写入文件
			}
		}
	}
}

func read() map[string]int {
	// 读取文件
	userFile, err := os.ReadFile("./homework/rollCall.json")
	if err != nil {
		fmt.Println("Json文件读取错误:", err)
		return make(map[string]int)
	}
	// json->map
	var userInfo map[string]int
	err = json.Unmarshal([]byte(userFile), &userInfo)
	if err != nil {
		fmt.Println("Json转换错误:", err)
	}
	if userInfo == nil {
		return make(map[string]int) // 返回空map
	}
	return userInfo
}

func write(userInfo map[string]int) {
	// map->json
	userJsonFile, err := json.MarshalIndent(userInfo, "", " ")
	if err != nil {
		fmt.Println("Map转换错误:", err)
	}
	// 写入
	err = os.WriteFile("./homework/rollCall.json", userJsonFile, 0644)
	if err != nil {
		fmt.Println("Json写入错误:", err)
	}
}
